/***************************************************************************************************
  Copyright(C)   2011-9-5
  All rights reserved.
  File Name: clientservice.h

  Description:进程控制模块
              主要是被服务端调用，用来监视显示控制器运行状态和升级服务端时开户一个新的进程来进行升级

  ***************************************************************************************************/

#ifndef MANAGEPROCESS_H
#define MANAGEPROCESS_H

#include <QObject>
#include <QProcess>
#include <QTimer>
#include <QDebug>
#include <QFile>
#include <QWidget>

#include "public/environment.h"

extern QString g_installPath;

class ManageProcess : public QObject
{
    Q_OBJECT
public:
    explicit ManageProcess(QObject *parent = 0);

    void startDisCtl(const QString &pgm, const QStringList &arguments,
                      enum QIODevice::OpenModeFlag mode = QIODevice::ReadWrite);

    void setDisCtl(const QString &pgm, const QStringList &arguments);

    void setfreDogTimeSize(int timeSize);

    void reSetTime();

    void killDisCtlProcess();
    void rebootDidCtl();

    bool updateService(const QString &programPath, const QString& updatePath, const QString& backupPath);

    void closeParentWidget(QWidget *parentWidget);
private:
    QProcess *displayProcess;                   //显示控制器进程
    QProcess *updateSerProcess;                 //更新辅助进程

    //显示控制器定时器，如果一定时间没有喂狗，那么它就会重启显示控制器
    QTimer *displayCtlTimer;

    //重启定时器，显示控制器重启时间，即显示控制器不是在一瞬间重启，会经过一会间隔后再重启
    QTimer *rebootTimer;

    //显示控制程序完全路径，用来启动显示控制程序
    QString displayPgm;

    //显示控制程序参数列表
    QStringList disCtlArgumentlist;

    //显示控制程序开启进程的方式
    enum QIODevice::OpenModeFlag openMode;


    int freDogTimeSize;                     //喂狗间隔时间

    QString servicePgm;                     //服务器程序
    QStringList auxiliaryArg;               //辅助程序参数列表
    QString auxiliaryPgm;                   //辅助程序

    QWidget *mParentWidget;                  //父进程
    QTimer closeTimer;                      //关闭父进程定时器

signals:
    void processReboot();
    void processDestroy();

private:
    void init();

private slots:
    void freDogTimeOut();
    void rebootSlot();

    void startUpdate(QProcess::ProcessState);
    void closeParent();

};

#endif // MANAGEPROCESS_H
